package day32;

import java.io.File;
import java.io.FileFilter;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

// Lambda表达式
// 本质上是匿名内部类
// 是匿名内部类语法上的简化
// java8引入了一个新的操作符: ->  箭头操作符
// lambda表达式基本语法: () -> {}
// 箭头左: lambda表达式的参数列表
// 箭头或: lambda体
// lambda表达式的使用, 需要 函数式接口 的支持
// 函数式接口: 只定义了一个抽象方法的接口
public class Demo01 {
	public static void main(String[] args) {
		test05();

	}

	private static void test05() {
		//		Comparator<String> com = new Comparator<String>() {
		//			@Override
		//			public int compare(String o1, String o2) {
		//				return Integer.compare(o1.length(), o2.length());
		//			}
		//		};
		Comparator<String> com = (o1, o2) -> Integer.compare(o1.length(), o2.length());
		Set<String> set = new TreeSet<String>(com);
	}

	private static void test04() {
		File f = new File("./src");
		//		FileFilter filter = new FileFilter() {
		//			@Override
		//			public boolean accept(File pathname) {
		//				return pathname.isDirectory();
		//			}
		//		};
		//		FileFilter filter = target -> target.isDirectory();
		//		File[] fs = f.listFiles(filter);
		File[] fs = f.listFiles(t -> t.isDirectory());
	}

	private static void test03() {
		//		Runnable run = new Runnable() {
		//			@Override
		//			public void run() {
		//				System.out.println(123);
		//			}
		//		};
		Runnable run = () -> System.out.println(123);
	}

	// lambda表达式语法原则: 能省则省
	private static void test02() {
		// 参数类型是可省略的
		// SomeInterface si = (String str) -> {System.out.println(str);};
		// SomeInterface si = (str) -> {System.out.println(str);};

		// 当参数只有一个时, 小括号可省略
		// 如果参数不止一个, 小括号不可省略
		// 或者没有参数时, 小括号不能省略
		// SomeInterface si = str -> {System.out.println(str);};

		// 当lambda体只有一条语句时, 大括号可省略(如果不止一条语句, 大括号不可省略)
		// SomeInterface si = str -> System.out.println(str);

		// 对于有返回值的lambda表达式
		// 当lambda体只有一条语句时, 不仅大括号可省略, return关键字也可省略
		// 该语句一定要产生一个结果, 且结果必须与抽象方法所定义的返回值类型相同
		// SomeInterface si = str -> {return "abc";};
		SomeInterface si = str -> "abc";

	}

	public static void test01() {
		//		SomeInterface si = new SomeInterface() {
		//			@Override
		//			public void doSome() {
		//				System.out.println(123);
		//			}
		//		};
		//
		//		SomeInterface si2 = new SomeInterface() {
		//			@Override
		//			public void doSome() {
		//				System.out.println(456);
		//			}
		//		};
		//
		//		SomeInterface si3 = () -> {
		//			System.out.println(111);
		//		};
	}
}

// ---------------

// java8提供了一个注解用来检查接口是否是函数式接口
@FunctionalInterface
interface SomeInterface {
	public String doSome(String str);
}